﻿// spdlog_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

// spdlog
#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include <iostream>
#include <memory>

bool SetConsoleColor(WORD Color);
#ifdef _WIN32
#define CLEAR_COLOR 7
static const WORD LOG_CONST_TABLE[][3] = {
		{0x97, 0x09 , 'T'},//蓝底灰字，黑底蓝字，window console默认黑底
		{0xA7, 0x0A , 'D'},//绿底灰字，黑底绿字
		{0xB7, 0x0B , 'I'},//天蓝底灰字，黑底天蓝字
		{0xE7, 0x0E , 'W'},//黄底灰字，黑底黄字
		{0xC7, 0x0C , 'E'} };//红底灰字，黑底红字

bool SetConsoleColor(WORD Color)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	if (handle == 0)
		return false;

	BOOL ret = SetConsoleTextAttribute(handle, Color);
	return(ret == TRUE);
}
#else
#define CLEAR_COLOR "\033[0m"
static const char* LOG_CONST_TABLE[][3] = {
		{"\033[44;37m", "\033[34m", "T"},
		{"\033[42;37m", "\033[32m", "D"},
		{"\033[46;37m", "\033[36m", "I"},
		{"\033[43;37m", "\033[33m", "W"},
		{"\033[41;37m", "\033[31m", "E"} };
#endif

//#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE

// spd 带行号的打印，同时输出console和文件
#define LOG_TRACE(...) SetConsoleColor(LOG_CONST_TABLE[0][1]);SPDLOG_LOGGER_CALL(spdlog::default_logger_raw(), spdlog::level::trace, __VA_ARGS__);SPDLOG_LOGGER_CALL(spdlog::get("daily_logger"), spdlog::level::trace, __VA_ARGS__)
#define LOG_DEBUG(...) SetConsoleColor(LOG_CONST_TABLE[1][1]);SPDLOG_LOGGER_CALL(spdlog::default_logger_raw(), spdlog::level::debug, __VA_ARGS__);SPDLOG_LOGGER_CALL(spdlog::get("daily_logger"), spdlog::level::debug, __VA_ARGS__)
#define LOG_INFO(...) SetConsoleColor(LOG_CONST_TABLE[2][1]);SPDLOG_LOGGER_CALL(spdlog::default_logger_raw(), spdlog::level::info,__VA_ARGS__);SPDLOG_LOGGER_CALL(spdlog::get("daily_logger"),spdlog::level::info, __VA_ARGS__)
#define LOG_WARN(...) SetConsoleColor(LOG_CONST_TABLE[3][1]);SPDLOG_LOGGER_CALL(spdlog::default_logger_raw(), spdlog::level::warn,__VA_ARGS__);SPDLOG_LOGGER_CALL(spdlog::get("daily_logger"), spdlog::level::warn,__VA_ARGS__)
#define LOG_ERROR(...) SetConsoleColor(LOG_CONST_TABLE[4][1]);SPDLOG_LOGGER_CALL(spdlog::default_logger_raw(),spdlog::level::err, __VA_ARGS__);SPDLOG_LOGGER_CALL(spdlog::get("daily_logger"),spdlog::level::err, __VA_ARGS__)

//#define LOG_DEBUG(X,...) SetConsoleColor(LOG_CONST_TABLE[0][1],__VA_ARGS__)
//#define LOG_INFO(X,...) SetConsoleColor(LOG_CONST_TABLE[1][1],__VA_ARGS__)
//#define LOG_WARN(X,...) SetConsoleColor(LOG_CONST_TABLE[2][1],__VA_ARGS__)
//#define LOG_ERROR(X,...) SetConsoleColor(LOG_CONST_TABLE[3][1],__VA_ARGS__)
//#define LOG_DEBUG(...) LOG_DEBUG_(...)
//#define LOG_INFO(...) LOG_DEBUG_(...)
//#define LOG_WARN(...) LOG_DEBUG_(...)
//#define LOG_ERROR(...) LOG_DEBUG_(...)



int main(int argc, char* argv[]) {
	// 按文件大小
//	auto file_logger = spdlog::rotating_logger_mt("file_log", "log/log.log", 1024 * 1024 * 100, 3);
//	auto file_logger = spdlog::rotating_logger_mt("daily_logger", "log/log.log", 1024 * 1024 * 100, 3);
	// 遇到warn flush日志，防止丢失
//	file_logger->flush_on(spdlog::level::warn);

//	// 每天2:30 am 新建一个日志文件
//	auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.log", 2, 30);
	// 每天0:00 am 新建一个日志文件
	auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.log", 0, 00);
	// 遇到warn flush日志，防止丢失
	logger->flush_on(spdlog::level::warn);
	//每三秒刷新一次
	spdlog::flush_every(std::chrono::seconds(3));

	// Set the default logger to file logger
	auto console = spdlog::stdout_color_mt("console");
	spdlog::set_default_logger(console);
	spdlog::set_level(spdlog::level::trace); // Set global log level to debug

	// change log pattern
	// %s：文件名
	// %#：行号
	// %!：函数名
//	spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - [<%s>|<%#>|<%!>] %v");
//	spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e:%t][%@] %v");
	spdlog::set_pattern("%Y-%m-%d %H:%M:%S.%f <thread %t> [%l] [%@] %v"); // with timestamp, thread_id, filename and line number
//	console->set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
//	file_logger->set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");

//	while (1) {
		for (int i = 0; i < 1000; ++i)
		{
			//同时输出到界面和文件
			LOG_TRACE("test trace");
			LOG_DEBUG("test debug");
			SPDLOG_DEBUG("111111111");
			LOG_INFO("test info");
			LOG_WARN("test warn");
			LOG_ERROR("test error");
			LOG_INFO("{} * {} equals {:>10}", i, i, i * i);
			LOG_INFO("{:>20}", "spdlog test");
			//只输出到界面
//			console->error("Some error message with arg{}..", 1);
			//只输出到文件
//			file_logger->error("Some error message with arg{}..", 2);
			Sleep(1000);
		}
//			rotating_logger->info("{} * {} equals {:>10}", i, i, i * i);
		
//	}


	// Release and close all loggers
	spdlog::drop_all();
}
